package com.casa_apoio.controller;

import com.casa_apoio.conversores.CriptografaSenha;
import com.casa_apoio.model.dao.AcessoDAO;
import com.casa_apoio.model.entity.Acesso;
import com.casa_apoio.util.FacesContextUtil;
import java.io.Serializable;
import java.util.List;
import javax.faces.application.FacesMessage;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.RequestScoped;
import javax.faces.context.FacesContext;

@ManagedBean
@RequestScoped
public class MbAcesso implements Serializable {

    private Acesso acesso;
    private Acesso acesso2;
    private List<Acesso> acessos;
    private String confereSenha;
    private List<String> permissoes;

    private AcessoDAO acessoDAO() {
        AcessoDAO<Acesso> acessoDAO = new AcessoDAO<Acesso>(Acesso.class, FacesContextUtil.getRequestSession());
        return acessoDAO;
    }

    public String salvarAcesso() {
        System.out.println("salvarAcesso");
        if (acesso.getIdAcesso() == null || acesso.getIdAcesso() < 1) {
            if (verifivaAcessoFuncionario()) {
                if (verificaLoginCadastrado()) {
                    System.out.println("novoAcesso");
                    acesso.getPermissao().add("ROLE_USUARIO");
                    novoAcesso();
                }
            }
            return "cadastroAcesso.faces";
        } else {
            if (verificaLoginCadastrado()) {
                System.out.println("alterarAcesso");
                alterarAcesso();
            }
            return "cadastroAcesso.faces";
        }

    }

    private void novoAcesso() {
        acesso.setSenha(CriptografaSenha.cipher(acesso.getSenha()));
        if (acesso.getSenha() == null ? confereSenha == null : acesso.getSenha().equals(CriptografaSenha.cipher(confereSenha))) {
            acessoDAO().salvar(acesso);
            FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_INFO, "Gravação efetuda com sucesso", ""));
            limparAcesso();
        } else {
            FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_WARN, "A senha não confere", ""));
        }
    }

    private void alterarAcesso() {
        try {
            acesso.setSenha(CriptografaSenha.cipher(acesso.getSenha()));
            if (acesso.getSenha() == null ? confereSenha == null : acesso.getSenha().equals(CriptografaSenha.cipher(confereSenha))) {
                acessoDAO().atualizarAcesso(acesso);
                FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_INFO, "Alteração efetuda com sucesso", ""));
                limparAcesso();
            } else {
                FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_WARN, "A senha não confere", ""));
            }
        } catch (Exception e) {
            System.out.println("Erro " + e.getMessage());
        }
    }

    public String limparAcesso() {
        acesso = new Acesso();
        return "cadastroAcesso.faces";
    }

    private boolean verificaLoginCadastrado() {
        boolean verifica = false;
        System.out.println("verificaLoginCadastrado");
        System.out.println("Login " + acesso.getLogin());
        acessos = acessoDAO().verificaLogin(acesso.getLogin());
        if (acessos.size() > 0) {
            acesso2 = acessos.get(0);
            Integer confereLogin = acesso2.getIdAcesso();
            acesso2 = null;
            if (acesso.getIdAcesso() != confereLogin) {
                FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_FATAL, "Esse login  ja existe, digite um login valido", ""));
                verifica = false;
            } else {
                verifica = true;
            }
            System.out.println("não deu erro");
        } else {
            verifica = true;
        }
        return verifica;
    }

    private boolean verifivaAcessoFuncionario() {
        acessos = acessoDAO().verificaFuncionarioComAcesso(acesso.getFuncionario().getIdFuncionario());
        if (acessos.size() > 0) {
            FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_FATAL, "Funcionario ja cadastrado no sistema de acesso!", ""));
            return false;
        } else {
            return true;
        }
    }

    public Acesso getAcesso() {
        if (acesso == null) {
            acesso = new Acesso();
        }
        return acesso;
    }

    public void setAcesso(Acesso acesso) {
        this.acesso = acesso;
    }

    public List<Acesso> getAcessos() {
        if (acessos == null) {
            acessos = acessoDAO().getEntitys();
        }
        return acessos;
    }

    public void setAcessos(List<Acesso> acessos) {
        this.acessos = acessos;
    }

    public String getConfereSenha() {
        return confereSenha;
    }

    public void setConfereSenha(String confereSenha) {
        this.confereSenha = confereSenha;
    }

    public Acesso getAcesso2() {
        return acesso2;
    }

    public void setAcesso2(Acesso acesso2) {
        this.acesso2 = acesso2;
    }

    public List<String> getPermissoes() {
        return permissoes;
    }

    public void setPermissoes(List<String> permissoes) {
        this.permissoes = permissoes;
    }
}
